1. Field of the Invention
The present invention relates to digital memory devices, and more particularly to methods and apparatus for on-chip bad block management for NAND flash memory.
2. Description of Related Art
NAND flash memory has become increasingly popular due to its significant cost advantage. Moreover, NAND flash memory is now available in a variety of different interfaces, ranging from traditional NAND interfaces to low pin count Serial Peripheral Interfaces (“SPI”).
NAND flash architecture organizes the memory array into blocks, each of which has a number of pages. Typical page sizes include 512 bytes, 2,048 bytes, and 4,096 bytes. A number of additional bytes are associated with each page, typically 16 bytes, 64 bytes, or 128 bytes, for storage of an error correcting code (“ECC”) checksum and sometimes for metadata. Reading and programming are performed on a page basis, while erasure is performed on a block basis.
Bad block management is commonly performed on NAND flash memory. Such memory is susceptible to bad block conditions, including blocks having failed memory cells at the time of manufacture, and blocks developing failed memory cells due to degradation of the memory cells with repeated use. The bad block management typically is performed by the device driver software on the host operating system, or by a separate dedicated controller chip. When a “bad” logical block is accessed by high-level software, it is mapped to a “good” physical block by the device driver or controller using a bad block mapping table, typically referred to as a look-up table (“LUT”). The LUT function is a collection of links between a logical block address (“LBA”) whose unmapped physical address is to a bad block, and a physical block address (“PBA”) of a mapped good block.
Use of the LUT has been effective with some of the commands commonly available for standard NAND flash memory devices, such as the page read command. Some commands such as the sequential read command have been made compatible with LUT use by limiting the commands to sequential reads within a given block.